﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LibraryEA;
using System.IO;

namespace ApoioEstimativa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        List<Modulo> modulos = null;

        private void VerificarDados()
        {
            if(txtAbaNegocio.Text.Trim() == string.Empty)
                throw new ExceptionEA("O campo Aba Negócio não pode estar em Branco");

            if(txtArquivo.Text.Trim() == string.Empty)
                throw new ExceptionEA("O campo Arquivo de EA não pode estar em Branco");

            //if(txtRTF.Text.Trim() == string.Empty)
            //    throw new ExceptionEA("O campo RTF não pode estar em Branco");

            //if(txtXAML.Text.Trim() == string.Empty)
            //    throw new ExceptionEA("O campo XAML não pode estar em Branco");

            if(comboBox1.SelectedItem == null)
                throw new ExceptionEA("O campo Módulo não pode estar em Branco");

            if(txtConfiguracao.Text == string.Empty)
                throw new ExceptionEA("O campo Configuração não pode estar em Branco");
        }

        private void btnProcessarnaTela_Click(object sender, EventArgs e)
        {

            //verificar se os campos foram preenchidos
            VerificarDados();


            Cursor.Current = Cursors.WaitCursor;
            try
            {
                VerificarDados();

                string arquivo_sharepoint = txtConfiguracao.Text;

                modulos = LibraryEA.LeitorXML.ProcessaModulo(arquivo_sharepoint, txtArquivo.Text, txtRTF.Text, txtXAML.Text, comboBox1.SelectedItem.ToString(), txtConfiguracao.Text, txtAbaNegocio.Text);

                lstList.Items.Clear();

                foreach(Modulo modulo in modulos)
                {
                    lstList.Items.Add(modulo);
                    lstList.DisplayMember = "Nome";
                }

                lblTotalHoras.Text = ProcessaTotaldeHoras(modulos);
            }
            catch(ExceptionEA ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            Cursor.Current = Cursors.Arrow;

            
        }

        private string ProcessaTotaldeHoras(List<Modulo> modulos)
        {
            double total = 0;
            foreach(Modulo m in modulos)
                foreach(Tipo t in m.Tipos)
                    foreach(ValorDado v in t.Valores)
                        total += v.Valor * v.Multiplicador;


            double days = (total / 60 / 60) / 8;

            double horas_totais = Math.Ceiling(days) * 8;

            return horas_totais.ToString();
        }

       

        private void PintarGrid()
        {

            foreach(DataGridViewRow dgr in dtgDados.Rows)
            {
                if(dgr.Cells[1].Value == System.DBNull.Value)
                {
                    dgr.Cells[0].Style.BackColor = Color.Lavender;
                    dgr.Cells[1].Style.BackColor = Color.Lavender;
                    dgr.Cells[2].Style.BackColor = Color.Lavender;
                }

                if(dgr.Cells[0].Value.ToString() == "Descrição")
                {
                    dgr.Cells[0].Style.BackColor = Color.LightSteelBlue;
                    dgr.Cells[1].Style.BackColor = Color.LightSteelBlue;
                    dgr.Cells[2].Style.BackColor = Color.LightSteelBlue;
                }
                if(dgr.Cells[1].Value.ToString() == "Total em Minutos/Horas")
                {
                    dgr.Cells[0].Style.BackColor = Color.DarkBlue;
                    dgr.Cells[1].Style.BackColor = Color.DarkBlue;
                    dgr.Cells[2].Style.BackColor = Color.DarkBlue;
                    dgr.Cells[0].Style.ForeColor = Color.White;
                    dgr.Cells[1].Style.ForeColor = Color.White;
                    dgr.Cells[2].Style.ForeColor = Color.White;
                    dgr.Cells[0].Style.Font = new Font(FontFamily.GenericSansSerif, 14);
                    dgr.Cells[1].Style.Font = new Font(FontFamily.GenericSansSerif, 14);
                    dgr.Cells[2].Style.Font = new Font(FontFamily.GenericSansSerif, 14);
                }
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "EA files (*.eap)|*.eap|All files (*.*)|*.*";
            openFileDialog1.ShowDialog();
            if(this.openFileDialog1.FileName != string.Empty)
                this.txtArquivo.Text = this.openFileDialog1.FileName;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Excel files (*.xls)|*.xls|All files (*.*)|*.*";
            openFileDialog1.ShowDialog();
            if(this.openFileDialog1.FileName != string.Empty)
                this.txtRTF.Text = this.openFileDialog1.FileName;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "XAML files (*.xaml)|*.xaml|All files (*.*)|*.*";
            openFileDialog1.ShowDialog();
            if(this.openFileDialog1.FileName != string.Empty)
                this.txtXAML.Text = this.openFileDialog1.FileName;
        }

        
        private void lstList_SelectedIndexChanged(object sender, EventArgs e)
        {
            //popula o combo
            Modulo modulo = (Modulo)lstList.SelectedItem;
            string texto = string.Empty;


            DataTable dados = new DataTable();
            dados.Columns.Add("Descricao");
            dados.Columns.Add("Quantidade");
            dados.Columns.Add("Total");

            int total = 0;

            foreach(Tipo tipo in modulo.Tipos)
            {

                
                if(tipo.Valores.Count > 0)
                {

                    DataRow dr = dados.NewRow();

                    dr[0] = tipo.Nome;
                    dr[1] = null;
                    dr[2] = null;


                    dados.Rows.Add(dr);


                    DataRow dr_descricao = dados.NewRow();

                    dr_descricao[0] = "Descrição";
                    dr_descricao[1] = "Quantidade";
                    dr_descricao[2] = "Total em Minutos";

                    dados.Rows.Add(dr_descricao);

                    foreach(ValorDado valor in tipo.Valores)
                    {
                        DataRow dr_int = dados.NewRow();

                        dr_int[0] = valor.Nome;
                        dr_int[1] = valor.Valor;
                        dr_int[2] = Convert.ToInt32((valor.Multiplicador * valor.Valor) / 60);
                        total += Convert.ToInt32((valor.Multiplicador * valor.Valor) / 60); 

                        dados.Rows.Add(dr_int);
                    }

                    DataRow dr_branco = dados.NewRow();

                    dr_branco[0] = "";
                    dr_branco[1] = "";
                    dr_branco[2] = "";

                    dados.Rows.Add(dr_branco);
                }


                


            }

            DataRow dr_total = dados.NewRow();

            dr_total[0] = "";
            dr_total[1] = "Total em Minutos/Horas";
            dr_total[2] = total + "/" + TransformaEmHoras(total);

            dados.Rows.Add(dr_total);

            dtgDados.DataSource = dados;

            PintarGrid();
        }

        private string TransformaEmHoras(int total)
        {
            string horas = string.Empty;

            int horas_int = total/60;
            int resto = total % 60;
            horas = horas_int.ToString("00") + ":" + resto.ToString("00");
            return horas;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //pega todo o conteudo e salva em um arquivo

            saveFileDialog1.Filter = "Html Files(*.html)|*.html";
            DialogResult save =  saveFileDialog1.ShowDialog();

            if(saveFileDialog1.FileName != null && saveFileDialog1.FileName != string.Empty)
            {

                StreamWriter fs = System.IO.File.CreateText(saveFileDialog1.FileName);
                fs.WriteLine(" ");
                fs.Flush();
                fs.Close();
                fs = null;

                

                string header = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";

                header += "<html xmlns=\"http://www.w3.org/1999/xhtml\">";

                string arquivo = header + @"
                            <head>
                            <title>Geração de Estimativa</title>  
                            <style type='text/css'>
                            body 
                            {
                                margin: 0px 0px 0px 0px;
                                font-family:Verdana;
                                font-size:x-small;
                            }
                            .uploadFile
                            {
                                border-width:1px;
                                border-color:Black;
                                font-family:Verdana;
                                font-size:small;
                            }
                            .combobox
                            {
                                border-width:1px;
                                border-color:Black;
                                font-family:Verdana;
                                font-size:small;
                            }
                            .linha_modulo
                            {
                                background-color:#CFDFF9;
                                height:20px;
                                font-size:12px;
                                padding:5px;
                            }

                            .linha_tipo
                            {
                                background-color:#E1ECFC;
                                padding:5px;
                                font-size:10px;
                                font-weight:bold;
                            }
                            .linha_espaco
                            {
                                background-color:white;
                                padding:5px;
                            }

                            .linha_valor
                            {
                                background-color:#CFDFF9;
                                padding:5px;
                                font-size:9px;
                            }
                            .tabela
                            {
                                border-width:1px;	
                                border-color:Black;
                                width:98%;
                                text-align:left;
                            }
                            .total
                            {
                                background-color:DarkBlue;
                                padding:5px;
                                font-size:12px;
                                color:white;
                            }

                            </style>
                            </head>
                            
                            <body>
                            " + GeraHTML(modulos) + @"
                            </body>
                            </html>
                            ";


                System.IO.File.AppendAllText(saveFileDialog1.FileName, arquivo, Encoding.UTF32);
                
            }

        }

        private string GeraHTML(List<Modulo> modulos)
        {
            string texto = string.Empty;

            texto = "<br><br><center><font size='5'>Total de Horas Gastas na Atividade: " + ProcessaTotaldeHoras(modulos) + "</font><br><br><br></center>";

            foreach(Modulo modulo in modulos)
            {
                texto += "<center><table class='tabela' cellspacing='0' cellpadding='0'>";

                texto += "<tr><td colspan = '3' class='linha_modulo'>" + modulo.Nome + "</td></tr>";

                foreach(Tipo tipo in modulo.Tipos)
                {
                    int totaldeminutos = 0;

                    if(tipo.Valores.Count > 0)
                    {

                        texto += "<tr><td colspan = '3' class='linha_tipo'>" + tipo.Nome + "</td></tr>";
                        texto += "<tr><td class='linha_tipo' style='width:400px;'>Descrição</td><td class='linha_tipo' style='width:100px;'>Quantidade</td><td class='linha_tipo' style='width:200px;'>Total em Minutos</td></tr>";

                        foreach(ValorDado valor in tipo.Valores)
                        {
                            texto += "<tr><td class='linha_valor'>" + valor.Nome + "</td><td class='linha_valor'>" + valor.Valor + "</td><td class='linha_valor'>" + Convert.ToInt32((valor.Multiplicador * valor.Valor) / 60) + "</td></tr>";
                            totaldeminutos += Convert.ToInt32((valor.Multiplicador * valor.Valor) / 60);
                        }

                        
                    }

                    if(totaldeminutos != 0)
                    {
                        texto += "<tr><td colspan = '3' class='total'>Total de Horas/Minutos: " + totaldeminutos + "/" + TransformaEmHoras(totaldeminutos) + "</td></tr>";
                        texto += "<tr><td colspan = '3' class='linha_espaco'>&nbsp;</td></tr>";
                    }
                }

                
                texto += "<tr><td colspan = '3' class='linha_espaco'>&nbsp;</td></tr>";


                texto += "</table></center>";
            }
            return texto;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "XML files (*.xml)|*.xml|All files (*.*)|*.*";
            openFileDialog1.ShowDialog();
            if(this.openFileDialog1.FileName != string.Empty)
                this.txtConfiguracao.Text = this.openFileDialog1.FileName;
        }

        
    }
}
